package com.rykj.util;

import android.text.TextUtils;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Description: author: zhangsan on 16/11/21 下午5:39.
 */

public class StringUtil {

    /**
     *
     */
    private static Pattern NUMBER_PATTERN = Pattern.compile("^(1[3|4|5|7|8][0-9])\\d{8}$");

    /**
     * 验证输入的身份证号是否合法
     */
    public static boolean isLegalId(String id) {
        return id.toUpperCase().matches("(^\\d{15}$)|(^\\d{17}([0-9]|X|x)$)");
    }

    /**
     * 校验银行卡卡号
     * @param cardId
     *         银行卡号
     * @return 是否是正确的银行卡号
     */
    public static boolean checkBankCard(String cardId) {
        if (cardId.length() < 12) {
            return false;
        }
        return true;

//        char bit = getBankCardCheckCode(cardId.substring(0, cardId.length() - 1));
//        if(bit == 'N'){
//            return false;
//        }
//        return cardId.charAt(cardId.length() - 1) == bit;
    }

    /**
     * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位
     */
    public static char getBankCardCheckCode(String nonCheckCodeCardId) {
        if (nonCheckCodeCardId == null || nonCheckCodeCardId.trim()
                .length() == 0 || !nonCheckCodeCardId.matches("\\d+")) {
            //如果传的不是数据返回N
            return 'N';
        }
        char[] chs = nonCheckCodeCardId.trim().toCharArray();
        int luhmSum = 0;
        for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
            int k = chs[i] - '0';
            if (j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }
            luhmSum += k;
        }
        return (luhmSum % 10 == 0)?'0':(char) ((10 - luhmSum % 10) + '0');
    }

    /**
     * 格式化银行卡号:四位一组
     * @param idNumber
     *         银行卡号
     */
    public static String formatBankCardID(String idNumber) {
        return idNumber.replaceAll("\\d{4}(?!$)", "$0 ");
    }

    /**
     *
     */
    public static boolean isNotEmpty(String str) {
        if (str != null && !"".equals(str) && !"null".equals(str)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     *
     */
    public static String checkStr(String value, String defaultValue) {
        return TextUtils.isEmpty(value)?defaultValue:value;
    }

    /**
     *
     */
    public static String getCurrentDate() {
        return getCurrentDate("yyyy-MM-dd HH:mm:ss");
    }

    public static String getCurrentDate(String pattern) {
        return new SimpleDateFormat(pattern, Locale.getDefault()).format(new Date());
    }

    /**
     * 获取时间格式字符串\\
     */
    public static String getTime(String dateStr) {
        return getTimeStrFromFormatStr("MM/dd HH:mm", dateStr);
    }

    /**
     * 获取指定格式的 时间字符串
     * @param toFormatString
     *         希望获得的时间 格式 （例如： yyyy-MM-dd ）
     * @param dateStr
     *         现有时间戳 （格式为  yyyy-MM-dd HH:mm ）
     */
    public static String getTimeStrFromFormatStr(String toFormatString, String dateStr) {
        return fTStTS("yyyy-MM-dd HH:mm", toFormatString, dateStr);
    }

    /**
     *
     */
    public static String fTStTS(String fromFormatString, String toFormatString, String dateStr) {
        SimpleDateFormat fromFormat = new SimpleDateFormat(fromFormatString, Locale.getDefault());
        SimpleDateFormat toFormat = new SimpleDateFormat(toFormatString, Locale.getDefault());
        Date date = null;
        try {
            date = fromFormat.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            dateStr = "";
            return dateStr;
        }
        return toFormat.format(date);
    }

    /**
     * 获取时间格式字符串
     */
    public static String getTimes(String dateStr) {
        return getTimeStrFromFormatStr("HH:mm", dateStr);
    }

    /**
     * 获取时间格式字符串
     */
    public static String getDate(String dateStr) {
        return getTimeStrFromFormatStr("MM-dd", dateStr);
    }

    /**
     * 获取时间的毫秒数
     * @param dateStr
     *         现有时间戳 （格式为  yyyy-MM-dd HH:mm ）
     */
    public static long getTimeFromFormatStr(String dateStr) {
        SimpleDateFormat simpleDateFormat = getTimeFormat();
        return getTimeFromFormatStr(dateStr, simpleDateFormat);
    }

    /**
     *
     */
    private static SimpleDateFormat getTimeFormat() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());
    }

    public static long getTimeFromFormatStr(String dateStr, SimpleDateFormat simpleDateFormat) {
        try {
            Date date = simpleDateFormat.parse(dateStr);
            return date.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }

    public static long getTimeFromFormatStr(String dateStr, String format) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault());
        return getTimeFromFormatStr(dateStr, dateFormat);
    }

    public static String timStrTim(String dateStr) {
        SimpleDateFormat fromFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
                Locale.getDefault());
        String str = "";
        try {
            Date date = fromFormat.parse(dateStr);
            long t = new Date().getTime() - date.getTime();
            if (t < 1000 * 60) {
                str = "刚刚";
            } else if (t < 1000 * 60 * 10) {
                SimpleDateFormat mat = new SimpleDateFormat("HH:mm", Locale.getDefault());
                str = mat.format(date);
            } else {
                SimpleDateFormat mat = new SimpleDateFormat("MM-dd HH:mm", Locale.getDefault());
                str = mat.format(date);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return str;
    }

    /**
     * 是否是手机号
     */
    public static boolean isPhone(String mobiles) {
        Matcher m = NUMBER_PATTERN.matcher(mobiles);
        return m.matches();
    }


    /**
     * 将传入的数字转换成以逗号分隔的形式，如传入123456789，转换成123,456,789
     */
    public static String getShowNumber(double number) {
        //如果是负数，取正
        boolean bellowzero = false;
        if (number < 0) {
            bellowzero = true;
            number = -number;
        }
        String str = number + "";
        int index = str.indexOf(".");
        String intStr = "";
        String lastStr = "";
        if (index != -1) {
            intStr = str.substring(0, index);
            lastStr = str.substring(index, str.length());
        } else {
            intStr = str;
        }
        StringBuilder sb = new StringBuilder(intStr);
        //根据数字的大小决定循环几次
        int count = (sb.length() - 1) / 3;
        int mod = sb.length() % 3 == 0?3:sb.length() % 3;
        for (int i = 1; i <= count; i++) {
            sb.insert(mod + 3 * (count - i), ",");
        }
        if (bellowzero) {
            sb.insert(0, "-");
        }
        sb.append(lastStr);
        sb.append("元");
        return sb.toString();
    }

    public static double getDot2(String doustr) {
        BigDecimal decimal = new BigDecimal(doustr);
        return decimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * first method
     *
     * @param bytes
     * @return
     */
    public static String bytes2hexFirst(byte[] bytes) {
        final String HEX = "0123456789abcdef";
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) {
            // 取出这个字节的高4位，然后与0x0f与运算，得到一个0-15之间的数据，通过HEX.charAt(0-15)即为16进制数
            sb.append(HEX.charAt((b >> 4) & 0x0f));
            // 取出这个字节的低位，与0x0f与运算，得到一个0-15之间的数据，通过HEX.charAt(0-15)即为16进制数
            sb.append(HEX.charAt(b & 0x0f));
        }

        return sb.toString();
    }
}
